using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Groundwater
{
    /// <summary>
    /// <para>Porous Puff</para>
    /// <para>Calculates the time-dependent, two-dimensional concentration distribution in mass per volume of a solute introduced instantaneously and at a discrete point into a vertically mixed aquifer.</para>
    /// <para>计算瞬时和离散点引入垂直混合含水层的溶质每体积质量随时间变化的二维浓度分布。</para>
    /// </summary>    
    [DisplayName("Porous Puff")]
    public class PorousPuff : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PorousPuff()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_track_file">
        /// <para>Input particle track file</para>
        /// <para><xdoc>
        ///   <para>The input particle track path file.</para>
        ///   <para>This is an ASCII text file containing information about the position, the local velocity vector, and the cumulative length and time of travel along the path.</para>
        ///   <para>This file is generated using the Particle Track tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入粒子轨迹路径文件。</para>
        ///   <para>这是一个 ASCII 文本文件，包含有关位置、局部速度矢量以及沿路径行驶的累积长度和时间的信息。</para>
        ///   <para>此文件是使用粒子轨迹工具生成的。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_porosity_raster">
        /// <para>Input effective formation porosity raster</para>
        /// <para>The input raster where each cell value represents the effective formation porosity at that location.</para>
        /// <para>输入栅格，其中每个像元值表示该位置的有效地层孔隙度。</para>
        /// </param>
        /// <param name="_in_thickness_raster">
        /// <para>Input saturated thickness raster</para>
        /// <para><xdoc>
        ///   <para>The input raster where each cell value represents the saturated thickness at that location.</para>
        ///   <para>The value for the thickness is interpreted from geological properties of the aquifer.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示该位置的饱和厚度。</para>
        ///   <para>厚度值是根据含水层的地质特性来解释的。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster of the concentration distribution.</para>
        ///   <para>Each cell value represents the concentration at that location.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>浓度分布的输出栅格。</para>
        ///   <para>每个单元格值表示该位置的浓度。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_mass">
        /// <para>Mass</para>
        /// <para>A value for the amount of mass released instantaneously at the source point, in units of mass.</para>
        /// <para>在源点瞬时释放的质量量的值，以质量为单位。</para>
        /// </param>
        public PorousPuff(object _in_track_file, object _in_porosity_raster, object _in_thickness_raster, object _out_raster, double? _mass)
        {
            this._in_track_file = _in_track_file;
            this._in_porosity_raster = _in_porosity_raster;
            this._in_thickness_raster = _in_thickness_raster;
            this._out_raster = _out_raster;
            this._mass = _mass;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Porous Puff";

        public override string CallName => "sa.PorousPuff";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_track_file, _in_porosity_raster, _in_thickness_raster, _out_raster, _mass, _dispersion_time, _longitudinal_dispersivity, _dispersivity_ratio, _retardation_factor, _decay_coefficient];

        /// <summary>
        /// <para>Input particle track file</para>
        /// <para><xdoc>
        ///   <para>The input particle track path file.</para>
        ///   <para>This is an ASCII text file containing information about the position, the local velocity vector, and the cumulative length and time of travel along the path.</para>
        ///   <para>This file is generated using the Particle Track tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入粒子轨迹路径文件。</para>
        ///   <para>这是一个 ASCII 文本文件，包含有关位置、局部速度矢量以及沿路径行驶的累积长度和时间的信息。</para>
        ///   <para>此文件是使用粒子轨迹工具生成的。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input particle track file")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_track_file { get; set; }


        /// <summary>
        /// <para>Input effective formation porosity raster</para>
        /// <para>The input raster where each cell value represents the effective formation porosity at that location.</para>
        /// <para>输入栅格，其中每个像元值表示该位置的有效地层孔隙度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input effective formation porosity raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_porosity_raster { get; set; }


        /// <summary>
        /// <para>Input saturated thickness raster</para>
        /// <para><xdoc>
        ///   <para>The input raster where each cell value represents the saturated thickness at that location.</para>
        ///   <para>The value for the thickness is interpreted from geological properties of the aquifer.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示该位置的饱和厚度。</para>
        ///   <para>厚度值是根据含水层的地质特性来解释的。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input saturated thickness raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_thickness_raster { get; set; }


        /// <summary>
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster of the concentration distribution.</para>
        ///   <para>Each cell value represents the concentration at that location.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>浓度分布的输出栅格。</para>
        ///   <para>每个单元格值表示该位置的浓度。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Mass</para>
        /// <para>A value for the amount of mass released instantaneously at the source point, in units of mass.</para>
        /// <para>在源点瞬时释放的质量量的值，以质量为单位。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mass")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _mass { get; set; }


        /// <summary>
        /// <para>Dispersion time</para>
        /// <para><xdoc>
        ///   <para>A value representing the time horizon for dispersion of the solute, in units of time.</para>
        ///   <para>The time must be less than or equal to the maximum time in the track file. If the requested time exceeds the available time from the track file, the tool is aborted. The default time is the latest time (corresponding to the terminal point) in the track file.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>一个值，表示溶质分散的时间范围，以时间为单位。</para>
        ///   <para>该时间必须小于或等于轨道文件中的最大时间。如果请求的时间超过跟踪文件中的可用时间，则工具将中止。默认时间是轨迹文件中的最新时间（对应于终端点）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dispersion time")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _dispersion_time { get; set; } = null;


        /// <summary>
        /// <para>Longitudinal dispersivity</para>
        /// <para><xdoc>
        ///   <para>A value representing the dispersivity parallel to the flow direction.</para>
        ///   <para>For details on how the default value is determined, and how it relates to the scale of the study, see the How Porous Puff works section in the documentation.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表示平行于流动方向的色散率的值。</para>
        ///   <para>有关如何确定默认值以及它与研究规模的关系的详细信息，请参阅文档中的“Porous Puff 的工作原理”部分。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Longitudinal dispersivity")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _longitudinal_dispersivity { get; set; } = null;


        /// <summary>
        /// <para>Dispersivity ratio</para>
        /// <para><xdoc>
        ///   <para>A value representing the ratio of longitudinal dispersivity over transverse dispersivity.</para>
        ///   <para>Transverse dispersivity is perpendicular to the flow direction in the same horizontal plane. The default value is three.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表示纵向色散率与横向色散率之比的值。</para>
        ///   <para>横向色散系数垂直于同一水平面上的流动方向。默认值为 3。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dispersivity ratio")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _dispersivity_ratio { get; set; } = 3;


        /// <summary>
        /// <para>Retardation factor</para>
        /// <para><xdoc>
        ///   <para>A dimensionless value representing the retardation of the solute in the aquifer.</para>
        ///   <para>Retardation varies between one and infinity, with one corresponding to no retardation. The default value is one.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表示含水层中溶质延迟的无量纲值。</para>
        ///   <para>延迟在 1 和无穷大之间变化，1 对应于无延迟。默认值为 1。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Retardation factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _retardation_factor { get; set; } = 1;


        /// <summary>
        /// <para>Decay coefficient</para>
        /// <para><xdoc>
        ///   <para>Decay coefficient for solutes undergoing first-order exponential decay (for example, radionuclides) in units of inverse time.</para>
        ///   <para>The default is zero, corresponding to no decay.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>经历一级指数衰变的溶质（例如放射性核素）的衰变系数，以反时间为单位。</para>
        ///   <para>默认值为零，对应于无衰减。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Decay coefficient")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _decay_coefficient { get; set; } = 0;


        public PorousPuff SetEnv(int? autoCommit = null, object cellSize = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}